package com.mh.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mh.dto.vo.BillFilterVo;
import com.mh.dto.vo.R;
import com.mh.dto.vo.BillShowVo;
import com.mh.pojo.Bill;
import com.mh.service.BillService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 账单表(Bill)表控制层
 *
 * @author zmh
 * @since 2025-02-08 09:18:49
 */
@RestController
@Slf4j
@CrossOrigin
@RequestMapping("/bills")
public class BillController {
    /**
     * 服务对象
     */
    @Autowired
    private BillService billService;

    /**
     * 根据日期获取当天所有账单
     * @param date 日期
     * @return ·
     */
    @GetMapping("/getBillByDate/{date}")
    R<List<BillShowVo>> getBillByDate(@PathVariable("date") String date){
        return billService.getBillByDate(date);
    }

    /**
     * 获取月份的每天收支情况加入到日期上显示结余
     * @param yearMonth 获取的年月数据
     * @return 包含每日结余的Map（日期字符串 -> 当日累计结余）
     */
    @GetMapping("/getCalendarDayDataOfMonth/{yearMonth}")
    R<Map<String, Double>> getCalendarDayDataOfMonth(@PathVariable("yearMonth") String yearMonth){
        return billService.getCalendarDayDataOfMonth(yearMonth);
    }

    /**
     * 获取账单数据
     * @param showPosition 账单组件位置：index-首页 all_bill：全部账单(过滤项)
     * @param billFilterVo 过滤项DTO -当账单组件显示在首页时all_bill过滤箱参数对象为空
     * @return ·
     */
    @PostMapping("/getBillData/{showPosition}")
    R<List<BillShowVo>> getBillData(@PathVariable("showPosition") String showPosition, @RequestBody BillFilterVo billFilterVo){
        return billService.getBillData(showPosition,billFilterVo);
    }

    /**
     * 添加账单
     * @param bill 账单数据
     * @return ·
     */
    @PostMapping("/addBill")
    R<Boolean> addBill(@RequestBody Bill bill){
        return billService.addBill(bill);
    }

    /**
     * 分页查询
     *
     * @param page 查询页数
     * @param size 一页显示条数
     * @return ·
     */
    @GetMapping("/page")
    public R<Page<Bill>> getAllByPage(int page, int size) {
        //执行查询
        return billService.getAllByPage(page, size);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R<Bill> selectOne(@PathVariable Serializable id) {
        return R.success(this.billService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param bill 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R<String> insert(@RequestBody Bill bill) {
        return R.success(this.billService.save(bill) + "");
    }

    /**
     * 修改数据
     *
     * @param bill 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R<String> update(@RequestBody Bill bill) {
        return R.success(this.billService.updateById(bill) + "");
    }

    /**
     * 删除数据
     *
     * @param id 主键结合
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public R<String> delete(@PathVariable("id") String id) {
        return R.success(this.billService.removeById(id) + "");
    }
}

